﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static List<float> list = new List<float>();
        static float score = 0;
        static double money;
        static double moneytwo;
        static void Main(string[] args)
        {
            StudentText();
             AtmTest(); 
        }    
        #region  第一题：
        //        第一题：
        //一个考试管理系统，需要录入考生成绩，只能录入数字，否则会报类型转换异常。请编写相关代码，
        //1、捕获FormatException异常，并打印输出“异常已处理；
        //2、捕获OverflowException异常，数值超出double范围的异常，并打印输出“异常已处理；
        //3、捕获一般异常Exception异常。
        //4、最终处理finally
        //录入成绩结束后，请输出，总学生数，总分数，平均分。
        static void StudentText() {
            try
            {
                for (int i = 0; i < 1; i++)
                {
                    Console.WriteLine("请输入学生成绩：");
                    float numone = float.Parse(Console.ReadLine());
                    score = score + numone;
                    list.Add(numone);           
                }
            }            
            catch (FormatException e)
            {
                Console.WriteLine("异常已处理");
                Console.WriteLine("{0},{1},{2}", e.Message, e.StackTrace, e.Source);
            }
            catch (OverflowException e)
            {
                Console.WriteLine("异常已处理");
                Console.WriteLine("{0},{1},{2}", e.Message, e.StackTrace, e.Source);
            }
            catch (Exception)
            {
                Console.WriteLine("一般异常已处理");
            }
        
            finally
            {            
                Console.WriteLine($"学生总人数：{list.Count}  学生的总分数：{score}  学生的平均分：{score / (list.Count)}");
            }
            Console.WriteLine("1.继续添加    2.停止添加");
            int numtwo = Convert.ToInt32(Console.ReadLine());
            switch (numtwo)
            {
                case 1:
                    StudentText();
                    break;
                case 2:
                    System.Environment.Exit(0);                         
                    break;
                default:
                    break;
            }
        }
        #endregion

        #region 第二题：
        //编写一个程序，用以接收用户输入的两个浮点型的数值，一个值表示用户想要存放在银行账户中的余额，另一个值表示用户想要从银行账户中提取的金额。
        //实现存取款功能，
        //用户功能选择：1、存款，2、取款
        //取款时：
        //当用户想要提取的金额大于余额时，请手动抛出一个ArgumentOutOfRangeException 参数超出范围的异常，异常信息可以写“取款金额大于余额，请重新输入”
        //，如此以确保取款金额始终不大于当前余额。
        //操作结束，打印输出余额是多少。
        //最后再添加catch一般异常 Exception，使得数据类型转换的异常也能被捕获到。
        static void AtmTest(){          
            Console.WriteLine("1、存款，2、取款");
            int num = Convert.ToInt32(Console.ReadLine());         
            switch (num)
            {
                case 1:
                    try
                    {
                        Console.WriteLine("请输入需存款金额：");
                        double moneyone = Convert.ToDouble(Console.ReadLine());
                        money = money + moneyone;
                    }
                    catch (Exception)
                    {
                        Console.WriteLine("数据类型转换的异常已处理");
                    }
                    finally {
                        AtmTest();
                    }
                    break;
                case 2:
                    Console.WriteLine("当前余额为：{0}",money);
                    try
                    {
                         Console.WriteLine("请输入需要取款的金额：");
                         moneytwo = Convert.ToDouble(Console.ReadLine());
                        
                        if (moneytwo > money)
                        {
                            throw new ArgumentOutOfRangeException("取款金额大于余额，请重新输入选择");
                        }
                        Console.WriteLine($"本次操作后账户余额为{money - moneytwo}");
                        money = money - moneytwo;
                    }                    
                    finally {
                        Console.WriteLine("\n\n\n");                        
                        AtmTest();
                    }
                    break;
                default:
                    Console.WriteLine("选择错误，请重新选择！！！");
                    AtmTest();
                    break;
            }

        }





        #endregion
    }
}
